home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / CD32 / CD32_Support / examples / SA_Examples / lowlevel / TimerInt / gui.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-17  |  10.4 KB  |  453 lines

  1. /*
  2.  * System includes
  3.  */
  4.  
  5. #include <exec/types.h>
  6. #include <exec/memory.h>
  7.  
  8. #include <dos/dos.h>
  9.  
  10. #include <intuition/intuition.h>
  11. #include <intuition/gadgetclass.h>
  12.  
  13. #include <libraries/gadtools.h>
  14.  
  15. #include <devices/timer.h>
  16.  
  17. #include <libraries/lowlevel.h>
  18.  
  19. #include <clib/exec_protos.h>
  20. #include <clib/dos_protos.h>
  21. #include <clib/intuition_protos.h>
  22. #include <clib/gadtools_protos.h>
  23. #include <clib/timer_protos.h>
  24. #include <clib/lowlevel_protos.h>
  25. #include <clib/alib_protos.h>
  26. /*#include <clib/debug_protos.h>*/
  27. extern void kprintf(const char *,...);
  28.  
  29. #include <pragmas/lowlevel_pragmas.h>
  30.  
  31. /*
  32.  * ANSI includes
  33.  */
  34.  
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #include <string.h>
  38.  
  39. /*
  40.  * Local includes
  41.  */
  42.  
  43. #include "timerint.h"
  44.  
  45. /****** TimerInt/guiOpen ******************************************
  46. *
  47. *   NAME
  48. *       guiOpen -- open graphical user interface
  49. *
  50. *   SYNOPSIS
  51. *       success=guiOpen();
  52. *
  53. *       BOOL guiOpen(void);
  54. *
  55. *   FUNCTION
  56. *       Open graphical user interface.
  57. *
  58. *   INPUTS
  59. *       None
  60. *
  61. *   RESULT
  62. *       success -- TRUE if success; FALSE if failure
  63. *
  64. *   EXAMPLE
  65. *
  66. *   NOTES
  67. *
  68. *   BUGS
  69. *
  70. *   SEE ALSO
  71. *       guiClose()
  72. *
  73. ******************************************************************************
  74. *
  75. */
  76. BOOL guiOpen(void)
  77. {
  78.  
  79.     struct NewGadget newGadget;
  80.     struct Gadget *previousGadget;
  81.  
  82.     static struct TextAttr textAttr ={
  83.         GUI_TYPEFACE, /* ta_Name */
  84.         GUI_TYPESIZE, /* ta_YSize */
  85.         NULL, /* ta_Style */
  86.         NULL  /* ta_Flags */
  87.     };
  88.  
  89.     static STRPTR modeLabels[] ={
  90.         "One-shot",
  91.         "Continuous",
  92.         NULL
  93.     };
  94.  
  95.     /*
  96.      * Open window
  97.      */
  98.  
  99.     /* Open window */
  100.     window=OpenWindowTags(NULL,
  101.         WA_Title, PROGRAM_NAME,
  102.         WA_InnerWidth, 224,
  103.         WA_InnerHeight, 114,
  104.         WA_DragBar, TRUE,
  105.         WA_CloseGadget, TRUE,
  106.         WA_DepthGadget, TRUE,
  107.         WA_Activate, TRUE,
  108.         WA_SimpleRefresh, TRUE,
  109.         WA_IDCMP, IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|
  110.             INTEGERIDCMP|NUMBERIDCMP|CYCLEIDCMP|BUTTONIDCMP,
  111.         TAG_DONE);
  112.     if (!window) {
  113.         return(FALSE);
  114.     }
  115.  
  116.     /* Fetch visual info */
  117.     visualInfo=GetVisualInfo(window->WScreen,TAG_DONE);
  118.     if (!visualInfo) {
  119.         return(FALSE);
  120.     }
  121.  
  122.     /* Create gadtools.library context */
  123.     previousGadget=gadgetList=CreateContext(&gadgetList);
  124.     if (!gadgetList) {
  125.         return(FALSE);
  126.     }
  127.  
  128.     /*
  129.      * Create gadgetry
  130.      */
  131.  
  132.     /* Interval gadget */
  133.     newGadget.ng_LeftEdge=window->BorderLeft+128;
  134.     newGadget.ng_TopEdge=window->BorderTop+12;
  135.     newGadget.ng_Width=80;
  136.     newGadget.ng_Height=16;
  137.     newGadget.ng_GadgetText="Interval (ms)";
  138.     newGadget.ng_TextAttr=&textAttr;
  139.     newGadget.ng_GadgetID=GUI_INTERVAL_ID;
  140.     newGadget.ng_Flags=PLACETEXT_LEFT;
  141.     newGadget.ng_VisualInfo=visualInfo;
  142.     newGadget.ng_UserData=NULL;
  143.     previousGadget=intervalGadget=CreateGadget(INTEGER_KIND,
  144.         previousGadget,&newGadget,
  145.         TAG_DONE);
  146.     if (!previousGadget) {
  147.         return(FALSE);
  148.     }
  149.  
  150.     /* Deviation gadget */
  151.     newGadget.ng_LeftEdge=window->BorderLeft+128;
  152.     newGadget.ng_TopEdge=window->BorderTop+36;
  153.     newGadget.ng_Width=80;
  154.     newGadget.ng_Height=16;
  155.     newGadget.ng_GadgetText="Deviation (ms)";
  156.     newGadget.ng_TextAttr=&textAttr;
  157.     newGadget.ng_GadgetID=GUI_DEVIATION_ID;
  158.     newGadget.ng_Flags=PLACETEXT_LEFT;
  159.     newGadget.ng_VisualInfo=visualInfo;
  160.     newGadget.ng_UserData=NULL;
  161.     previousGadget=deviationGadget=CreateGadget(NUMBER_KIND,
  162.         previousGadget,&newGadget,
  163.         GTNM_Border, TRUE,
  164.         TAG_DONE);
  165.     if (!previousGadget) {
  166.         return(FALSE);
  167.     }
  168.  
  169.     /* Mode gadget */
  170.     newGadget.ng_LeftEdge=window->BorderLeft+80;
  171.     newGadget.ng_TopEdge=window->BorderTop+60;
  172.     newGadget.ng_Width=128;
  173.     newGadget.ng_Height=16;
  174.     newGadget.ng_GadgetText="Mode";
  175.     newGadget.ng_TextAttr=&textAttr;
  176.     newGadget.ng_GadgetID=GUI_MODE_ID;
  177.     newGadget.ng_Flags=PLACETEXT_LEFT;
  178.     newGadget.ng_VisualInfo=visualInfo;
  179.     newGadget.ng_UserData=NULL;
  180.     previousGadget=modeGadget=CreateGadget(CYCLE_KIND,
  181.         previousGadget,&newGadget,
  182.         GTCY_Labels, &modeLabels,
  183.         TAG_DONE);
  184.     if (!previousGadget) {
  185.         return(FALSE);
  186.     }
  187.  
  188.     /* Start gadget */
  189.     newGadget.ng_LeftEdge=window->BorderLeft+8;
  190.     newGadget.ng_TopEdge=window->BorderTop+92;
  191.     newGadget.ng_Width=64;
  192.     newGadget.ng_Height=16;
  193.     newGadget.ng_GadgetText="Start";
  194.     newGadget.ng_TextAttr=&textAttr;
  195.     newGadget.ng_GadgetID=GUI_START_ID;
  196.     newGadget.ng_Flags=PLACETEXT_IN;
  197.     newGadget.ng_VisualInfo=visualInfo;
  198.     newGadget.ng_UserData=NULL;
  199.     previousGadget=startGadget=CreateGadget(BUTTON_KIND,
  200.         previousGadget,&newGadget,
  201.         TAG_DONE);
  202.     if (!previousGadget) {
  203.         return(FALSE);
  204.     }
  205.  
  206.     /* Stop gadget */
  207.     newGadget.ng_LeftEdge=window->BorderLeft+144;
  208.     newGadget.ng_TopEdge=window->BorderTop+92;
  209.     newGadget.ng_Width=64;
  210.     newGadget.ng_Height=16;
  211.     newGadget.ng_GadgetText="Stop";
  212.     newGadget.ng_TextAttr=&textAttr;
  213.     newGadget.ng_GadgetID=GUI_STOP_ID;
  214.     newGadget.ng_Flags=PLACETEXT_IN;
  215.     newGadget.ng_VisualInfo=visualInfo;
  216.     newGadget.ng_UserData=NULL;
  217.     previousGadget=stopGadget=CreateGadget(BUTTON_KIND,
  218.         previousGadget,&newGadget,
  219.         TAG_DONE);
  220.     if (!previousGadget) {
  221.         return(FALSE);
  222.     }
  223.  
  224.     /*
  225.      * Attach gadgetry
  226.      */
  227.  
  228.     /* Add gadget list to window */
  229.     AddGList(window,gadgetList,-1,-1,NULL);
  230.  
  231.     /* Refresh gadgetry */
  232.     RefreshGList(gadgetList,window,NULL,-1);
  233.     GT_RefreshWindow(window,NULL);
  234.  
  235.     /*
  236.      * Success
  237.      */
  238.  
  239.     /* Success */
  240.     return(TRUE);
  241.  
  242. }
  243.  
  244. /****** TimerInt/guiClose **************************************************
  245. *
  246. *   NAME
  247. *       guiClose -- close graphical user interface
  248. *
  249. *   SYNOPSIS
  250. *       guiClose();
  251. *
  252. *       void guiClose(void);
  253. *
  254. *   FUNCTION
  255. *       Close graphical user interface.
  256. *
  257. *   INPUTS
  258. *       None
  259. *
  260. *   RESULT
  261. *       None
  262. *
  263. *   EXAMPLE
  264. *
  265. *   NOTES
  266. *
  267. *   BUGS
  268. *
  269. *   SEE ALSO
  270. *       guiOpen()
  271. *
  272. ******************************************************************************
  273. *
  274. */
  275. void guiClose(void)
  276. {
  277.  
  278.     /* If intuition.library and gadtools.library open ... */
  279.     if (IntuitionBase && GadtoolsBase) {
  280.  
  281.         /* If window open ... */
  282.         if (window) {
  283.  
  284.             /* If visual info ... */
  285.             if (visualInfo) {
  286.  
  287.                 /* If gadgets created ... */
  288.                 if (gadgetList) {
  289.  
  290.                     /* Remove gadgetry from window */
  291.                     RemoveGList(window,gadgetList,-1);
  292.  
  293.                     /* Free gadgetry */
  294.                     FreeGadgets(gadgetList);
  295.  
  296.                 }
  297.  
  298.                 /* Free visual info */
  299.                 FreeVisualInfo(visualInfo);
  300.  
  301.             }
  302.  
  303.             /* Close window */
  304.             CloseWindow(window);
  305.  
  306.         }
  307.  
  308.     }
  309.  
  310. }
  311.  
  312. /****** TimerInt/guiLoop ***************************************************
  313. *
  314. *   NAME
  315. *       guiLoop -- event loop for graphical user interface
  316. *
  317. *   SYNOPSIS
  318. *       guiLoop();
  319. *
  320. *       void guiLoop(void);
  321. *
  322. *   FUNCTION
  323. *       Event loop for graphical user interface.
  324. *
  325. *   INPUTS
  326. *       None
  327. *
  328. *   RESULT
  329. *       None
  330. *
  331. *   EXAMPLE
  332. *
  333. *   NOTES
  334. *
  335. *   BUGS
  336. *
  337. *   SEE ALSO
  338. *
  339. ******************************************************************************
  340. *
  341. */
  342. void guiLoop(void)
  343. {
  344.  
  345.     ULONG signalFlags;
  346.  
  347.     struct IntuiMessage *imsg;
  348.     ULONG class;
  349.     USHORT code;
  350.     APTR iaddress;
  351.  
  352.     /* Endless loop */
  353.     FOREVER {
  354.  
  355.         /* Wait for ... */
  356.         signalFlags=
  357.             Wait((1<<window->UserPort->mp_SigBit) /* window message ... */
  358.                  | (1<<timerSignal) /* or timer signal */
  359.             );
  360.  
  361.         /* If window message ... */
  362.         if (signalFlags&(1<<window->UserPort->mp_SigBit)) {
  363.  
  364.             /* Process window message queue */
  365.             while (imsg=GT_GetIMsg(window->UserPort)) {
  366.  
  367.                 /* Fetch fields from message */
  368.                 class=imsg->Class;
  369.                 code=imsg->Code;
  370.                 iaddress=imsg->IAddress;
  371.  
  372.                 /* Reply to message */
  373.                 GT_ReplyIMsg(imsg);
  374.  
  375.                 /* Switch on class */
  376.                 switch (class) {
  377.  
  378.                     /* Window close event */
  379.                     case IDCMP_CLOSEWINDOW:
  380.                         /* Exit event loop */
  381.                         return;
  382.  
  383.                     /* Window refresh event */
  384.                     case IDCMP_REFRESHWINDOW:
  385.                         /* Refresh window */
  386.                         GT_BeginRefresh(window);
  387.                         GT_EndRefresh(window,TRUE);
  388.                         break;
  389.  
  390.                     /* Window gadget event */
  391.                     case IDCMP_GADGETUP:
  392.                         {
  393.                             struct Gadget *gadget;
  394.  
  395.                             gadget=(struct Gadget *) iaddress;
  396.                             switch (gadget->GadgetID) {
  397.  
  398.                                 /* Interval */
  399.                                 case GUI_INTERVAL_ID:
  400.                                     /* Fetch interval */
  401.                                     GT_GetGadgetAttrs(intervalGadget,window,NULL,
  402.                                         GTIN_Number, &timerInterval,
  403.                                         TAG_DONE);
  404.                                     break;
  405.  
  406.                                 /* Mode */
  407.                                 case GUI_MODE_ID:
  408.                                     /* Mode selection is code */
  409.                                     timerContinuous=
  410.                                         (code==GUI_MODE_CONTINUOUS_CODE)?
  411.                                             TRUE:FALSE;
  412.                                     break;
  413.  
  414.                                 /* Start */
  415.                                 case GUI_START_ID:
  416.                                     timerStart();
  417.                                     break;
  418.  
  419.                                 /* Stop */
  420.                                 case GUI_STOP_ID:
  421.                                     timerStop();
  422.                                     break;
  423.  
  424.                             }
  425.  
  426.                         }
  427.                         break;
  428.  
  429.                     /* Default */
  430.                     default:
  431.                         /* No action */
  432.                         break;
  433.  
  434.                 }
  435.  
  436.             }
  437.  
  438.         }
  439.  
  440.         /* If timer signal ... */
  441.         if (signalFlags&(1<<timerSignal)) {
  442.  
  443.             /* Update deviation */
  444.             GT_SetGadgetAttrs(deviationGadget,window,NULL,
  445.                 GTNM_Number, deviation,
  446.                 TAG_DONE);
  447.  
  448.         }
  449.  
  450.     }
  451.  
  452. }
  453.